package com.zwim.common;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;

/**
 *
 *TCP socket configuration contains configuration for main server channel
 *  * and client channels
 *  * tCP套接字配置包含主服务器通道的配置和客户端配置
 *  @see java.net.SocketOptions
 * @author zhenjiang.gong
 * @date
 */
@Slf4j
@Setter
@Getter
@ToString(callSuper = true)
public class SocketConfig {
    /**
     *默认开启，TCP/IP协议中针对TCP默认开启了Nagle算法。
     * Nagle算法通过减少需要传输的数据包，
     * 来优化网络。在内核实现中，
     * 数据包的发送和接受会先做缓存，
     * 分别对应于写缓存和读缓存。
     */
    private boolean tcpNoDelay = true;
    /**
     *TCP发送缓存区 ,系统默认是8192
     */
    private int tcpSendBufferSize = -1;
    /**
     *接收缓存区 ,系统默认是8192
     */
    private int tcpReceiveBufferSize = -1;
    /**
     *存活定时器
     * 开启会造成1.带宽占用；2.在短暂故障时会释放良好链接
     * 自己编写心跳机制保活
     */
    private boolean tcpKeepAlive = false;
    /**
     * 延迟关闭的时间
     * so_linger选项用来设置，
     * 等待套接字发送缓冲区中的数据发送完成。
     * 没有设置该选项时，在调用close()后，在发送完fin后会立即进行一些清理工作并返回。
     * 如果设置了so_linger选项，
     * 并且等待时间为正值，则在清理之前会等待一段时间
     */
    private int soLinger = -1;
    /**
     * true:可重用
     * false:不可重用
     *这个套接字选项通知内核，如果端口忙，
     * 但TCP状态位于 TIME_WAIT ，可以重用端口。
     * 如果端口忙，而TCP状态位于其他状态，重用端口时依旧得到一个错误信息，
     * 指明"地址已经使用中"。如果你的服务程序停止后想立即重启，
     * 而新套接字依旧使用同一端口，此时SO_REUSEADDR 选项非常有用。必须意识到，
     * 此时任何非期望数据到达，都可能导致服务程序反应混乱，
     * 不过这只是一种可能，事实上很不可能。
     */
    private boolean reuseAddress = false;
    /**
     * 设置客户端与服务器tcp连接数量
     *前面已经提到过，内核会根据somaxconn和backlog
     * 的较小值设置accept queue的大小，
     * 如果想扩大accept queue的大小，必须要同时调整这两个参数。
     */
    private int acceptBackLog = 1024;
}
